package com.cskaoyan.interfaces;

/*
        成员区别
            抽象类
               a. 成员变量：既可以是普通成员变量，也可以被final修饰的常量
               b. 成员方法：有抽象方法; 非抽象方法
               c. 可以有构造方法
            接口
               a. 成员变量: 只能是静态常量;
               b. 抽象方法: 只能有抽象方法
               c. 没有构造方法

        关系区别
            类与类 继承，只能单继承
            类与接口 实现，单实现(实现一个接口)，多实现(实现多个接口)
            接口与接口 继承，单继承(继承一个接口)，多继承(继承多个接口)

        设计理念区别
              设计理念区别
      抽象类
         a. 被继承体现的是：”is a”的关系。
              1). 抽象类可以被其他类继承，而且子类只能extends一个类(一个类只能有一个父类)
              2). 抽象父类被子类继承之后，子类和抽象类的关系，is a 如果子类没有定义新的成员，
                  从成员访问的角度来看，访问子类成员和访问父类成员没有区别

         b. 共性功能

       接口
         a. 被实现体现的是：”like a”的关系。
              1). 一个类可以同时多个接口（实现也是一种实质上的继承关系） 一个类可以有多个父接口
              2). 类实现接口之后，类和接口的关系用like a来描述，因为接口子类对象可以访问的方法，
                   通过某接口父类引用可能访问不到(因为该方法可能时子类实现的另一个接口中定义的)

        b. 扩展功能

 */
public class Demo5Compare {

    public static void main(String[] args) {

        ExtendFather father = null;

        // 通过引用变量访问父类成员
        System.out.println(father.a);
        father.access();

        // 通过父类引用，访问子类成员
//        father = new ExtendSon();
//        System.out.println(father.a);
//        father.access();
//
//        // 一个接口通常只能代表，子类一部分成员
//        // 通过接口引用访问子类实例
//        FirstTestInterface firstInterface;
//        // 接口的间接实例化
//        firstInterface = new InterfaceSon();
//        firstInterface.first();
//        //firstInterface.second();
//
//        // 一个接口通常只能代表，子类一部分成员
//        SecondTestInterface secondInterface;
//        secondInterface = new InterfaceSon();
//
//        secondInterface.second();
        //secondInterface.first();


    }
}

abstract class ExtendFather {
    int a;
    public abstract void access();
}

/*
    该子类继承了父类，同时没有在子类中定义新的成员
 */
class ExtendSon extends ExtendFather {

    @Override
    public void access() {

    }
}

interface FirstTestInterface {
    void first();
}

interface SecondTestInterface {
    void second();
}

class InterfaceSon implements FirstTestInterface, SecondTestInterface {

    @Override
    public void first() {
        System.out.println("first");
    }

    @Override
    public void second() {
        System.out.println("second");
    }
}
